home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / cvs / contrib / cvs2vendor < prev    next >
Text File  |  2005-10-16  |  5KB  |  148 lines

  1. #! /bin/sh
  2. #
  3. #    cvs2vendor - move revsisions from files in A to files in B
  4. # The primary reason for this script is to move deltas from a
  5. # non-vendor branched repository onto a fresh vendor branched one,
  6. # skipping the initial checkin in assumption that it is the same in
  7. # both repositories.  This way you can take a project that was moved
  8. # into CVS without the benefit of the vendor branch and for all
  9. # intents and purposes add the vendor branch underneath the existing
  10. # deltas.
  11. # This script is also a decent example of repository maintenance using
  12. # raw RCS commands (if I do say so myself! ;-).
  13. # Tags are preserved.
  14. # The timestamp of the initial vendor branch revision will be adjusted
  15. # to be the same as the 1.1 revision of each source file.
  16. # Extra branches in the source directory will cause breakage.
  17. # Intermediate files are created in the current working directory
  18. # where this script is started.
  19. # Written by Greg A. Woods <woods@planix.com>, based on rcs2sccs
  20. # (retains some of the rlog parsing from it).
  21. # The copyright is in the Public Domain.
  22. #
  23.  
  24. if [ $# -ne 2 ]; then
  25.     echo USAGE: $0 srcdir dstdir
  26.     exit 2
  27. fi
  28. tsrcdir=$1
  29. tdstdir=$2
  30.  
  31. revfile=/tmp/cvs2vendor_$$_rev
  32. rm -f $revfile
  33.  
  34. commentfile=/tmp/cvs2vendor_$$_comment
  35. rm -f $commentfile
  36.  
  37. if sort -k 1,1 /dev/null 2>/dev/null
  38. then sort_each_field='-k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9'
  39. else sort_each_field='+0 +1 +2 +3 +4 +5 +6 +7 +8'
  40. fi
  41.  
  42. srcdirs=`cd $tsrcdir && find . -type d -print | sed 's~^\.[/]*~~'`
  43.  
  44. # the "" is a trick to get $tsrcdir itself without resorting to '.'
  45. for ldir in "" $srcdirs; do
  46.  
  47.     srcdir=$tsrcdir/$ldir
  48.     dstdir=$tdstdir/$ldir
  49.  
  50.     # Loop over every RCS file in srcdir
  51.     #
  52.     for vfile in $srcdir/*,v; do
  53.         # get rid of the ",v" at the end of the name
  54.         file=`echo $vfile | sed -e 's/,v$//'`
  55.         bfile=`basename $file`
  56.  
  57.         if [ ! -d $dstdir ]; then
  58.             echo "making locally added directory $dstdir"
  59.             mkdir -p $dstdir
  60.         fi
  61.         if [ ! -f $dstdir/$bfile,v ]; then
  62.             echo "copying locally added file $dstdir/$bfile ..."
  63.             cp $vfile $dstdir
  64.             continue;
  65.         fi
  66.  
  67.         # work on each rev of that file in ascending order
  68.         rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u $sort_each_field | sed -e 's/ /./g' > $revfile
  69.  
  70.         for rev in `cat $revfile`; do
  71.  
  72.             case "$rev" in
  73.             1.1)
  74.                 newdate=`rlog -r$rev $file | grep "^date: " | awk '{printf("%s.%s\n",$2,$3); exit}' | sed -e 's~/~.~g' -e 's/:/./g' -e 's/;//' -e 's/^19//'`
  75.                 olddate=`rlog -r1.1.1.1 $dstdir/$bfile | grep "^date: " | awk '{printf("%s.%s\n",$2,$3); exit}' | sed -e 's~/~.~g' -e 's/:/./g' -e 's/;//' -e 's/^19//'`
  76.                 sed "s/$olddate/$newdate/" < $dstdir/$bfile,v > $dstdir/$bfile.x
  77.                 mv -f $dstdir/$bfile.x $dstdir/$bfile,v
  78.                 chmod -w $dstdir/$bfile,v
  79.                 symname=`rlog -h $file | sed -e '1,/^symbolic names:/d' -e 's/[     ]*//g' | awk -F: '$2 == "'"$rev"'" {printf("-n%s:1.1.1.1\n",$1)}'`
  80.                 if [ -n "$symname" ]; then
  81.                     echo "tagging $file with $symname ..."
  82.                     rcs $symname $dstdir/$bfile,v
  83.                     if [ $? != 0 ]; then
  84.                         echo ERROR - rcs $symname $dstdir/$bfile,v
  85.                         exit 1
  86.                     fi
  87.                 fi
  88.                 continue            # skip first rev....
  89.                 ;;
  90.             esac
  91.  
  92.             # get a lock on the destination local branch tip revision
  93.             co -r1 -l $dstdir/$bfile
  94.             if [ $? != 0 ]; then
  95.                 echo ERROR - co -r1 -l $dstdir/$bfile
  96.                 exit 1
  97.             fi
  98.             rm -f $dstdir/$bfile
  99.  
  100.             # get file into current dir and get stats
  101.             date=`rlog -r$rev $file | grep "^date: " | awk '{printf("%s %s\n",$2,$3); exit}' | sed -e 's/;//'`
  102.             author=`rlog -r$rev $file | grep "^date: " | awk '{print $5; exit}' | sed -e 's/;//'`
  103.  
  104.             symname=`rlog -h $file | sed -e '1,/^symbolic names:/d' -e 's/[     ]*//g' | awk -F: '$2 == "'"$rev"'" {printf("-n%s\n",$1)}'`
  105.  
  106.             rlog -r$rev $file | sed -e '/^branches: /d' -e '1,/^date: /d' -e '/^===========/d' | awk '{if ((total += length($0) + 1) < 510) print $0}' > $commentfile
  107.  
  108.             echo "==> file $file, rev=$rev, date=$date, author=$author $symname"
  109.  
  110.             co -p -r$rev $file > $bfile
  111.             if [ $? != 0 ]; then
  112.                 echo ERROR - co -p -r$rev $file
  113.                 exit 1
  114.             fi
  115.  
  116.             # check file into vendor repository...
  117.             ci -f -m"`cat $commentfile`" -d"$date" $symname -w"$author" $bfile $dstdir/$bfile,v
  118.             if [ $? != 0 ]; then
  119.                 echo ERROR - ci -f -m"`cat $commentfile`" -d"$date" $symname -w"$author" $bfile $dstdir/$bfile,v
  120.                 exit 1
  121.             fi
  122.             rm -f $bfile
  123.  
  124.             # set the default branch to the trunk...
  125.             # XXX really only need to do this once....
  126.             rcs -b1 $dstdir/$bfile
  127.             if [ $? != 0 ]; then
  128.                 echo ERROR - rcs -b1 $dstdir/$bfile
  129.                 exit 1
  130.             fi
  131.         done
  132.     done
  133. done
  134.  
  135. echo cleaning up...
  136. rm -f $commentfile
  137. echo "       Conversion Completed Successfully"
  138.  
  139. exit 0
  140.